﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using ibba.src.norisk.ServiceCommon;
using System.Threading;
using System.Globalization;
using ibba.src.norisk.ServiceParametrosReprocessamento;
using System.Text.RegularExpressions;

namespace ibba.src.norisk.page
{
    public partial class PageReprocessamento : Page
    {
        #region Variáveis

        int _idReferencia = 0;
        int _idReferenciaReprocessamento = 0;
        int _idOrigem = 0;
        DateTime _dtInclusao;

        private List<ServiceProdutoModalidade.ProdutoModalidade> _produtos;
        ReferenciaProcessamento referenciaProcessamento = new ReferenciaProcessamento();
        #endregion

        public PageReprocessamento()
        {
            InitializeComponent();

            Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");

            if (AppHelper.Perfil.Contains("Producao"))
            {
                CarregarBarraBotoes();
                CarregaToolTip();
                CarregaDadosUltimoProcessamento();
                CarregaOrigem();
                CarregaProdutoModalidade();
                CarregaMotivos();
                CarregaParametrizacoes();
            }
            else
            {
                MessageBoxHelper.ShowWarning("Acesso Negado", "Você não possui acesso a este módulo. Contate o administrador do sistema");
            }
        }

        private void CarregaParametrizacoes()
        {
            ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginObterParametrizacaoReprocessamento(null, null, "A", CallBackObterParametrizacaoReprocessamento,
                                                                                              ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
        }

        private void CarregaMotivos()
        {
            ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginObterJustificativaReprocessamento(CallBackObterJustificativaReprocessamento,
                                                                                              ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
        }

        private void CarregaProdutoModalidade()
        {
            ServiceFactory.GetInstance().ServiceProdutoModalidade.BeginObterProdutoModalidade(CallBackObterProdutoModalidade,
                                                                                              ServiceFactory.GetInstance().ServiceProdutoModalidade);
        }

        private void CarregaDadosUltimoProcessamento()
        {
            ServiceFactory.GetInstance().ServiceCommon.BeginObterUltimaDataReferencia(CallBackObterUltimaDataReferencia,
                                                                                        ServiceFactory.GetInstance().ServiceCommon);
        }

        private void CarregaOrigem()
        {
            ServiceFactory.GetInstance().ServiceCommon.BeginObterOrigens(CallBackObterOrigens,
                                                                           ServiceFactory.GetInstance().ServiceCommon);
        }

        private void CarregarBarraBotoes()
        {
            App.MainPage.barraMenu.AddNewButton(Constantes.EnumBotoes.BOTAO_SALVAR.ToString(), "Salvar Alterações",
                                                Constantes.SourceImagem.BOTAO_SALVAR, 0,
                                                new ibba.src.slcomponentes.ControlMenuBar.Botao.DelegateClick(btnSalvar_Click));


            App.MainPage.barraMenu.AddNewButton(Constantes.EnumBotoes.BOTAO_ADICIONAR.ToString(), "Novo Parâmetro",
                                                Constantes.SourceImagem.BOTAO_ADICIONAR, 0,
                                                new ibba.src.slcomponentes.ControlMenuBar.Botao.DelegateClick(btnIncluir_Click));


            App.MainPage.barraMenu.AddNewButton(Constantes.SourceImagem.BOTAO_REJEITAR.ToString(), "Cancelar",
                                                Constantes.SourceImagem.BOTAO_REJEITAR, 2,
                                                new ibba.src.slcomponentes.ControlMenuBar.Botao.DelegateClick(btnCancelar_Click));

            this.AlterarVisibilidadeBotoes(true);
        }

        private void CarregaToolTip()
        {
            ToolTipService.SetToolTip(txtDataReferencia, "Data do último processamento realizado");
            ToolTipService.SetToolTip(dtpDataCarga, "Data de referência a ser usada para selecionar os dados");
            ToolTipService.SetToolTip(cboOrigem, "Origem da informação");
            ToolTipService.SetToolTip(checkProduto, "Habilita a seleção de produto");
            ToolTipService.SetToolTip(txtProduto, "Digite o produto desejado para filtro");
            ToolTipService.SetToolTip(checkModalidade, "Habilita a seleção de modalidade");
            ToolTipService.SetToolTip(txtModalidade, "Digite a modalidade desejada para filtro");
            ToolTipService.SetToolTip(cboJustificativa, "Informe a justificativa para o reprocessamento");
            ToolTipService.SetToolTip(txtObservacoes, "Preencha detalhes ou observações sobre o reprocessamento");
        }

        private bool ValidarDados()
        {
            bool retorno = true;

            if (dtpDataCarga.SelectedDate.HasValue)
                this.ValidaDataReferencia(dtpDataCarga.SelectedDate.Value);

            if (dtpDataCarga.SelectedDate.Equals(null) && !dtpDataCarga.SelectedDate.HasValue)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Selecione uma Data.");
                dtpDataCarga.Focus();
                return false;
            }

            if (_idReferenciaReprocessamento == 0)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Data de referência inválida, verifique");
                return false;
            }

            if (cboOrigem.SelectedItem == null)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Selecione a origem dos dados.");
                return false;
            }

            if (cboJustificativa.SelectedItem == null)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Informe a justificativa para a parametrização.");
                return false;
            }

            bool produtoEncontrado = (from p in _produtos
                                      where p.CodigoProduto.Trim().ToUpper() == this.txtProduto.Text.ToString().Trim().ToUpper()
                                      select p.CodigoProduto.Trim()).Any();

            bool modalidadeEncontrada = (from p in _produtos
                                         where p.CodigoModalidade.Trim().ToUpper() == this.txtModalidade.Text.ToString().Trim().ToUpper()
                                         select p.CodigoModalidade.Trim()).Any();

            if (!string.IsNullOrEmpty(this.txtProduto.Text) && !produtoEncontrado)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Verifique o produto selecionado.");
                return false;
            }

            if (!string.IsNullOrEmpty(this.txtModalidade.Text) && !modalidadeEncontrada)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Verifique a modalidade selecionada.");
                return false;
            }

            return retorno;
        }

        private void btnSalvar_Click()
        {
            this.ExibeCarregando(true, "Gravando...");

            if (ValidarDados())
            {
                this.InsereParametrizacao();
            }
            else
            {
                ExibeCarregando(false, null);
                //MessageBoxHelper.ShowWarning("Aviso", "Verifique o preenchimento dos campos.");
            }
        }

        private void InsereParametrizacao()
        {
            int idOrigem = ((ibba.src.norisk.ServiceCommon.Origem)(cboOrigem.SelectedItem)).IdOrigem;
            int idJustificativa = ((ibba.src.norisk.ServiceParametrosReprocessamento.JustificativaReprocessamento)(cboJustificativa.SelectedValue)).IdMotivo;
            if (_idReferenciaReprocessamento == 0)
            {
                MessageBoxHelper.ShowWarning("Aviso", "Data de referência inválida, verifique");
                ExibeCarregando(false, null);
                return;
            }

            ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginInserirParametrizacaoReprocessamento(
                idJustificativa,
                idOrigem,
                referenciaProcessamento.IdReferencia,
                _idReferenciaReprocessamento,
                string.IsNullOrEmpty(txtProduto.Text) ? null : txtProduto.Text,
                string.IsNullOrEmpty(txtModalidade.Text) ? null : txtModalidade.Text,
                string.IsNullOrEmpty(txtObservacoes.Text) ? null : txtObservacoes.Text,
                AppHelper.LoginUsuario,
                CallBackInserirParametrizacaoReprocessamento, ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
        }

        private void btnIncluir_Click()
        {
            this.AlterarVisibilidadeBotoes(false);
            this.HabilitarControles(true);
        }

        private void AlterarVisibilidadeBotoes(bool exibir)
        {
            bool visivel = AppHelper.Perfil.Contains("Producao");

            if (visivel)
            {
                App.MainPage.barraMenu.AlterarVisibilidadeBotao(Constantes.EnumBotoes.BOTAO_ADICIONAR.ToString(), exibir);
                App.MainPage.barraMenu.AlterarVisibilidadeBotao(Constantes.EnumBotoes.BOTAO_SALVAR.ToString(), !exibir);
                App.MainPage.barraMenu.AlterarVisibilidadeBotao(Constantes.SourceImagem.BOTAO_REJEITAR.ToString(), !exibir);
            }
            App.MainPage.barraMenu.AtualizarControles();
        }

        private void btnCancelar_Click()
        {
            this.AlterarVisibilidadeBotoes(true);
            this.LimparCampos();
            this.HabilitarControles(false);
        }

        private void LimparCampos()
        {
            this.dtpDataCarga.SelectedDate = null;
            this.txtProduto.Text = string.Empty;
            this.txtModalidade.Text = string.Empty;
            this.txtObservacoes.Text = string.Empty;
            this.cboOrigem.SelectedIndex = -1;
            this.cboJustificativa.SelectedIndex = -1;
            this.checkModalidade.IsChecked = false;
            this.checkProduto.IsChecked = false;
        }

        private void HabilitarControles(bool pHabilitar)
        {
            this.dtpDataCarga.IsEnabled = pHabilitar;
            this.txtObservacoes.IsEnabled = pHabilitar;
            this.cboOrigem.IsEnabled = pHabilitar;
            this.cboJustificativa.IsEnabled = pHabilitar;
            this.checkProduto.IsEnabled = pHabilitar;
            if (pHabilitar)
            {
                grdParametros.Visibility = System.Windows.Visibility.Collapsed;
                panelConsultasProdutos.Visibility = System.Windows.Visibility.Collapsed;
            }
            else
            {
                grdParametros.Visibility = System.Windows.Visibility.Visible;
                panelConsultasProdutos.Visibility = System.Windows.Visibility.Visible;
            }
        }

        private void AlterarCursorParaAguardando()
        {
            this.Cursor = System.Windows.Input.Cursors.Wait;
        }

        private void AlterarCursorParaModoNormal()
        {
            this.Cursor = System.Windows.Input.Cursors.Arrow;
        }

        private void ExibeCarregando(bool enable, string busyContent)
        {
            activity.BusyContent = busyContent;
            activity.IsBusy = enable;
            App.MainPage.barraMenu.VisibilityButtons = enable ? System.Windows.Visibility.Collapsed : System.Windows.Visibility.Visible;
        }

        // Executes when the user navigates to this page.
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            //TODO: Log deve ser feito no contexto da aplicação, não somente da página
        }

        private void checkProduto_Checked(object sender, RoutedEventArgs e)
        {
            if (checkProduto.IsChecked.Value)
            {
                txtProduto.IsEnabled = true;
            }
            else
            {
                txtProduto.IsEnabled = false;
            }
        }

        private void checkProduto_Unchecked(object sender, RoutedEventArgs e)
        {
            if (!checkProduto.IsChecked.Value)
            {
                this.txtProduto.Text = string.Empty;
                this.txtProduto.IsEnabled = false;
                this.checkModalidade.IsChecked = false;
                this.checkModalidade.IsEnabled = false;
                this.txtModalidade.Text = string.Empty;
                this.txtModalidade.IsEnabled = false;
            }
        }

        private void checkModalidade_Checked(object sender, RoutedEventArgs e)
        {
            if (checkModalidade.IsChecked.Value)
            {
                txtModalidade.IsEnabled = true;
                CarregarListaModalidade();
            }
        }

        private void checkModalidade_Unchecked(object sender, RoutedEventArgs e)
        {
            if (!checkModalidade.IsChecked.Value)
            {
                this.txtModalidade.Text = string.Empty;
                this.txtModalidade.IsEnabled = false;
            }
        }

        private void CarregarListaModalidade()
        {
            if (this.txtProduto.SelectedItem != null || !String.IsNullOrEmpty(this.txtProduto.Text))
            {
                string busca = this.txtProduto.SelectedItem != null ? this.txtProduto.SelectedItem.ToString() : txtProduto.Text;

                txtModalidade.ItemsSource = (from p in _produtos
                                             where p.CodigoProduto.Trim().ToUpper() == busca.ToUpper()
                                             select p.CodigoModalidade).Distinct().ToList();
            }
        }

        private void CarregarListaProdutos()
        {
            txtProduto.ItemsSource = (from p in _produtos select p.CodigoProduto.Trim()).Distinct();
            activity.IsBusy = false;
        }

        private void txtProduto_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
        {
            if (e.Key == System.Windows.Input.Key.Enter || txtProduto.Text.Length >= 2)
            {
                CarregarListaModalidade();
            }
        }

        private void txtProduto_TextChanged(object sender, RoutedEventArgs e)
        {
            if (txtProduto.Text.Length > 0)
            {
                this.checkModalidade.IsEnabled = true;
            }
            else
            {
                this.checkModalidade.IsChecked = false;
                this.checkModalidade.IsEnabled = false;
                this.txtModalidade.Text = string.Empty;
                this.txtModalidade.IsEnabled = false;
            }
        }

        private void CallBackObterProdutoModalidade(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _produtos = ((ServiceProdutoModalidade.IProdutoModalidade)pAsyncResult.AsyncState).EndObterProdutoModalidade(pAsyncResult);

                var _p = (from p in _produtos select p.CodigoProduto.Trim()).Distinct();

                CarregarListaProdutos();
            });
        }

        private void CallBackObterUltimaDataReferencia(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                referenciaProcessamento = ((ServiceCommon.ICommon)pAsyncResult.AsyncState).EndObterUltimaDataReferencia(pAsyncResult);

                MostraDadosUltimoProcessamento(referenciaProcessamento);

                // Validar se está no range dos 30 dias
                dtpDataCarga.DisplayDateStart = referenciaProcessamento.DataReferencia.AddMonths(-1);
                dtpDataCarga.DisplayDateEnd = referenciaProcessamento.DataReferencia;
            });
        }

        private void CallBackObterOrigens(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                List<Origem> origem = ((ServiceCommon.ICommon)pAsyncResult.AsyncState).EndObterOrigens(pAsyncResult);

                CarregaComboOrigens(origem);
            });
        }

        private void CallBackObterJustificativaReprocessamento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                List<JustificativaReprocessamento> motivos = ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndObterJustificativaReprocessamento(pAsyncResult);

                CarregaComboMotivosReprocessamento(motivos);
            });
        }

        private void CallBackExcluirParametrizacaoReprocessamento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                try
                {
                    ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndExcluirParametrizacaoReprocessamento(pAsyncResult);
                    this.CarregaParametrizacoes();
                    this.panelConsultasProdutos.Visibility = Visibility.Collapsed;
                    MessageBoxHelper.ShowSucess("Sucesso", "Parametrização desativada");
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    ExibeCarregando(false, null);
                }
            });
        }

        private void CallBackObterParametrizacaoReprocessamento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                List<ServiceParametrosReprocessamento.ParametrizacaoReprocessamento> parametros =
                    ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndObterParametrizacaoReprocessamento(pAsyncResult);

                CarregaGridParametrizacoes(parametros);
            });
        }

        private void CallBackInserirParametrizacaoReprocessamento(IAsyncResult pAsyncResult)
        {
            int retorno = 0;
            this.Dispatcher.BeginInvoke(delegate()
            {
                try
                {
                    retorno = ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndInserirParametrizacaoReprocessamento(pAsyncResult);

                    if (retorno > 0)
                    {
                        MessageBoxHelper.ShowSucess("Sucesso", "Gravação efetuada com sucesso.");

                        this.CarregaParametrizacoes();
                        this.AlterarVisibilidadeBotoes(true);
                        this.LimparCampos();
                        this.HabilitarControles(false);
                    }
                    else
                    {
                        if (retorno == -2)
                        {
                            MessageBoxHelper.ShowWarning("Aviso", "Produto ou Modalidade inválidos. Verifique.");
                        }
                        else
                        {
                            MessageBoxHelper.ShowWarning("Aviso", "Já existe parametrização com esses dados. Verifique.");
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    ExibeCarregando(false, null);
                }
            });
        }

        private void CallBackValidaDataReferencia(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _idReferenciaReprocessamento = ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndValidaDataReferencia(pAsyncResult);
            });
        }

        private void CallBackObterProdutoModalidadeReprocessamento(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                List<ServiceParametrosReprocessamento.ParametrizacaoReprocessamento> parametros =
                    ((ServiceParametrosReprocessamento.IServiceParametrosReprocessamento)pAsyncResult.AsyncState).EndObterProdutoModalidadeReprocessamento(pAsyncResult);

                this.CarregaGridDetalhes(parametros);
            });
        }

        private void CarregaGridDetalhes(List<ParametrizacaoReprocessamento> parametros)
        {
            this.dataGridProdutos.ItemsSource = parametros;

            if (parametros.Count > 0)
                this.panelConsultasProdutos.Visibility = Visibility.Visible;
        }

        private void CarregaGridParametrizacoes(List<ParametrizacaoReprocessamento> parametros)
        {
            this.grdParametros.ItemsSource = parametros;
            this.grdParametros.Visibility = System.Windows.Visibility.Visible;
        }

        private void MostraDadosUltimoProcessamento(ReferenciaProcessamento referenciaProcessamento)
        {
            this.txtDataReferencia.Text = referenciaProcessamento.DataReferencia.ToString("dd/MM/yyyy");
        }

        private void CarregaComboMotivosReprocessamento(List<JustificativaReprocessamento> motivos)
        {
            this.cboJustificativa.ItemsSource = motivos;
            this.cboJustificativa.DisplayMemberPath = "DscMotivo";
        }

        private void CarregaComboOrigens(List<Origem> origem)
        {
            this.cboOrigem.ItemsSource = origem;
            this.cboOrigem.DisplayMemberPath = "NomeOrigem";
        }

        private void ValidaDataReferencia(DateTime dataReferencia)
        {
            ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginValidaDataReferencia(dataReferencia, CallBackValidaDataReferencia,
                                                                                              ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
        }

        private void CarregaGridDetalhes()
        {
            ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginObterProdutoModalidadeReprocessamento(_idOrigem, _idReferencia, _idReferenciaReprocessamento, _dtInclusao, CallBackObterProdutoModalidadeReprocessamento,
                                                                                              ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
        }

        private void btnDetalhes_Click(object sender, RoutedEventArgs e)
        {
            if (grdParametros.SelectedIndex != -1)
            {
                _idReferencia = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdReferencia;
                _idReferenciaReprocessamento = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdReferenciaReprocessamento;
                _idOrigem = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdOrigem;
                _dtInclusao = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).DtInclusao;

                CarregaGridDetalhes();
            }
        }

        private void btnExcluir_Click(object sender, RoutedEventArgs e)
        {
            if (grdParametros.SelectedIndex != -1)
            {
                _idReferencia = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdReferencia;
                _idReferenciaReprocessamento = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdReferenciaReprocessamento;
                _idOrigem = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).IdOrigem;
                _dtInclusao = ((ibba.src.norisk.ServiceParametrosReprocessamento.ParametrizacaoReprocessamento)(grdParametros.SelectedItem)).DtInclusao;

                MessageBoxHelper.ShowQuestion("Confirmação", "Confirma a exclusão deste parâmetro?", window_OnMessageBoxClosed);
            }
        }

        private void window_OnMessageBoxClosed(MessageBoxResult result)
        {
            if (result == MessageBoxResult.Yes)
            {
                ExibeCarregando(true, "Carregando...");
                ServiceFactory.GetInstance().ServiceParametrosReprocessamento.BeginExcluirParametrizacaoReprocessamento(_idOrigem, _idReferencia, _idReferenciaReprocessamento, _dtInclusao, CallBackExcluirParametrizacaoReprocessamento,
                                   ServiceFactory.GetInstance().ServiceParametrosReprocessamento);
            }
        }

        private void dtpDataCarga_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtpDataCarga.SelectedDate.HasValue)
            {
                this.ValidaDataReferencia(dtpDataCarga.SelectedDate.Value);
            }
        }

        private void dtpDataCarga_DateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
        {
            MessageBoxHelper.ShowWarning("Erro", "Formato de data inválido, verifique");
            dtpDataCarga.Focus();
        }
    }
}
